//package com.starlink.common.lock;
//
//import com.starlink.common.enums.ErrorCode;
//import com.starlink.common.exception.BusinessException;
//import lombok.Builder;
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.RLock;
//import org.redisson.api.RReadWriteLock;
//import org.redisson.api.RedissonClient;
//
//import java.util.Objects;
//import java.util.concurrent.Callable;
//import java.util.concurrent.TimeUnit;
//import java.util.function.Supplier;
//
///**
// * 分布式锁：基于redis实现
// */
//@Slf4j
//@Builder
//public class DistributeLock {
//
//    private RedissonClient redissonClient;
//
//    /**
//     * 加锁
//     *
//     * @param lockName
//     * @return
//     */
//    public RLock lock(String lockName) {
//        RLock lock = redissonClient.getLock(lockName);
//        return lock;
//    }
//
//    /**
//     * 公平锁
//     *
//     * @param key
//     * @return
//     */
//    public RLock fairLock(String key) {
//        return redissonClient.getFairLock(key);
//    }
//
//    /**
//     * 带超时的锁
//     *
//     * @param lockName
//     * @param timeout  超时时间 单位：秒
//     */
//    public RLock lock(String lockName, int timeout) {
//        RLock lock = redissonClient.getLock(lockName);
//        lock.lock(timeout, TimeUnit.SECONDS);
//        return lock;
//    }
//
//    /**
//     * 读写锁
//     *
//     * @param key
//     * @return 读写锁
//     */
//    public RReadWriteLock readWriteLock(String key) {
//        return redissonClient.getReadWriteLock(key);
//    }
//
//    /**
//     * 带超时的锁
//     *
//     * @param lockName
//     * @param unit     时间单位
//     * @param timeout  超时时间
//     */
//    public RLock lock(String lockName, TimeUnit unit, int timeout) {
//        RLock lock = redissonClient.getLock(lockName);
//        lock.lock(timeout, unit);
//        return lock;
//    }
//
//    /**
//     * 加锁
//     *
//     * @param lockName
//     * @param supplier
//     * @return
//     */
//    public <T> T lock(String lockName, Supplier<T> supplier, String errMsg) {
//        RLock lock = lock(lockName);
//        try {
//            lock.lock();
//            return supplier.get();
//        } catch (Exception e) {
//            log.error("lock err, errMsg:{}", e.getMessage(), e);
//            throw new BusinessException(ErrorCode.INTER_ERR, errMsg);
//        } finally {
//            if (lock != null && lock.isLocked()) {
//                lock.unlock();
//            }
//        }
//    }
//
//    /**
//     * 加锁
//     *
//     * @param lockName
//     * @param callable
//     * @param errMsg
//     * @return
//     */
//    public <T> T lockThenCall(String lockName, Callable<T> callable, String errMsg) {
//        RLock lock = lock(lockName);
//        try {
//            boolean ret = lock.tryLock();
//            if (ret) {
//                return callable.call();
//            } else {
//                throw new BusinessException(ErrorCode.INTER_ERR, "get lock fail, please try again later");
//            }
//        } catch (BusinessException e) {
//            throw e;
//        } catch (Exception e) {
//            log.error("lockThenCall err, errMsg:{}", e.getMessage(), e);
//            throw new BusinessException(ErrorCode.INTER_ERR, errMsg);
//        } finally {
//            if (lock != null && lock.isLocked()) {
//                lock.unlock();
//            }
//        }
//    }
//
//    /**
//     * 加锁
//     *
//     * @param lockName
//     * @param runnable
//     * @return
//     */
//    public void lockThenRun(String lockName, Runnable runnable, String errMsg) {
//        RLock lock = lock(lockName);
//        try {
//            boolean ret = lock.tryLock();
//            if (ret) {
//                runnable.run();
//            } else {
//                throw new BusinessException(ErrorCode.INTER_ERR, "get lock fail, please try again later");
//            }
//        } catch (BusinessException e) {
//            throw e;
//        } catch (Exception e) {
//            log.error("lockThenRun err, errMsg:{}", e.getMessage(), e);
//            throw new BusinessException(ErrorCode.INTER_ERR, errMsg);
//        } finally {
//            if (lock != null && lock.isLocked()) {
//                lock.unlock();
//            }
//        }
//    }
//
//    /**
//     * 尝试获取锁
//     *
//     * @param lockName
//     * @param waitTime  等待时间
//     * @param leaseTime 自动释放锁时间
//     * @return
//     */
//    public boolean tryLock(String lockName, int waitTime, int leaseTime) {
//        RLock lock = redissonClient.getLock(lockName);
//        try {
//            return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
//        } catch (InterruptedException e) {
//            return false;
//        }
//    }
//
//    /**
//     * 尝试获取锁
//     *
//     * @param lockName
//     * @param unit      时间单位
//     * @param waitTime  等待时间
//     * @param leaseTime 自动释放锁时间
//     * @return
//     */
//    public boolean tryLock(String lockName, TimeUnit unit, int waitTime, int leaseTime) {
//        RLock lock = redissonClient.getLock(lockName);
//        try {
//            return lock.tryLock(waitTime, leaseTime, unit);
//        } catch (InterruptedException e) {
//            return false;
//        }
//    }
//
//    /**
//     * 释放锁
//     *
//     * @param lockName
//     */
//    public void unlock(String lockName) {
//        RLock lock = redissonClient.getLock(lockName);
//        if (Objects.nonNull(lock)) {
//            lock.unlock();
//        }
//    }
//
//
//    /**
//     * 释放锁
//     *
//     * @param lock
//     */
//    public void unlock(RLock lock) {
//        lock.unlock();
//    }
//}